package com.seleniti.enpareja.controller.ui.view;

import java.util.List;
import java.util.Set;

import org.ioc.commons.flowcontrol.actioncontroller.IsExternalAction;
import org.ioc.commons.flowcontrol.eventbus.IsEvent;
import org.ioc.commons.flowcontrol.operationmanager.IsOperation;
import org.ioc.commons.ui.HasEnabled;
import org.ioc.commons.ui.HasLoader;
import org.ioc.commons.ui.HasValue;
import org.ioc.commons.ui.IsViewPresenter;
import org.ioc.commons.ui.features.HasBoards;
import org.ioc.commons.ui.features.HasHelpTips;
import org.ioc.commons.ui.features.IsBoard;
import org.ioc.commons.ui.features.IsHelpTip;

import com.seleniti.enpareja.controller.common.domain.LoggedUserInfo;
import com.seleniti.enpareja.controller.model.integration.database.domain.ShoppingListElement;
import com.seleniti.enpareja.controller.ui.view.ShoppingListView.Board;
import com.seleniti.enpareja.controller.ui.view.ShoppingListView.HelpTips;

public interface ShoppingListView extends
		EnParejaView<ShoppingListView.Event, ShoppingListView.Operation, ShoppingListView.Action>, HasLoader,
		HasEnabled, HasBoards<Board>, HasHelpTips<HelpTips> {

	@interface Fires {
		ShoppingListView.Event[] value();
	}

	@interface Invokes {
		ShoppingListView.Action[] value();
	}

	@interface Performs {
		ShoppingListView.Operation[] value();
	}

	public enum Event implements IsEvent {
	}

	public enum Operation implements IsOperation {
		GettingData, Saving
	}

	public enum Action implements IsExternalAction {
	}

	public interface Presenter extends IsViewPresenter {

		void onSwitchElementFromList(ShoppingListElement value);

		void onAddNewElement();

		void onActionModeChanged();

		void onSelectionChanged();

		void onRenameElement(ShoppingListElement element);

		void onWeHaveFilterChanged();

		void onModifyButtonToggled(boolean enabled);

		void onRefreshData();

		void onSetAmountButtonToggled(boolean enabled);

		void onAmountChanged(ShoppingListElement element, Integer amount);

		void onAddSelectedBasicElements();

		void onCancelAddingSelectedBasicElements();

		void onShowBasics();

		boolean onGoBoardBack();
	}

	public enum ActionMode {
		SWITCH_LIST, DELETE_ELEMENT, RENAME_ELEMENT, SET_AMOUNT;
	}

	public enum Board implements IsBoard {
		SHOPPING_LIST, BASIC_PRODUCTS_LIST;
	}

	public enum HelpTips implements IsHelpTip {
		BASIC_PRODUCTS("Productos básicos", "Añade a tu lista algunos de los productos básicos más comunes"), SWITCH_PRODUCTS(
				"Mover productos",
				"Haz clic sobre un elemento recien comprado para pasarlo a la parte de elementos que 'Tenemos'. Cuando se te acabe, haz clic de nuevo y volverá a formar parte de los elementos que 'No quedan'"), FILTER_WE_DONT_HAVE(
				"Filtrar productos", "Haz clic sobre el texto 'No queda' para ver sólo los productos que te faltan"), SET_AMOUNTS(
				"Establecer cantidad", "Pulsa aquí para indicar las cantidades que necesitas de cada producto"), SCHEDULE_GO_TO_MARKET(
				"Ir a comprar", "Planifica cuando quieres ir al super");

		private final String text;
		private final String title;

		private HelpTips(String title, String text) {
			this.title = title;
			this.text = text;
		}

		public String getText() {
			return this.text;
		}

		public String getTitle() {
			return this.title;
		}
	}

	void setActionMode(ActionMode mode);

	List<ShoppingListElement> shoppingList();

	void addNewElement();

	ActionMode getActionMode();

	Set<ShoppingListElement> getSelection();

	void renameElement(ShoppingListElement element);

	HasValue<Boolean> weDontHaveFilter();

	void switchElementFromList(ShoppingListElement element);

	HasValue<Integer> weDontHaveCounter();

	void scrollToElement(int idx);

	HasValue<Board> boardShown();

	List<String> basicProducts();

	Set<String> selectedBasicProducts();

	void showBasics();

	// TODO: Mover a una vista generíca que requiere login
	HasValue<LoggedUserInfo> loggedUserInfo();
}
